From: Richard M. Stallman Date: Wed, 26 Jan 1994 17:19:32 +0000 (+0000) Subject: (next-line): Move error signaling and special end of X-Git-Tag: archive/raspbian/1%29.2+1-2+rpi1^2~5^2~93385 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/www.github.com/%22bookmarks:///%22http:/www.example.com/cgi/%22https:/www.github.com/%22bookmarks:/?a=commitdiff_plain;h=028922cf6acc7bea74e082b6924190a531922046;p=emacs.git (next-line): Move error signaling and special end of line behavior into line-move so that next-line is symmetric with previous-line when next-line-add-newlines is nil. (line-move): Move as far as possible and ding with a message if the requested motion cannot be accomplished. When selective-display is numeric, ensure point actually moves and does so to a visible line. --- diff --git a/lisp/simple.el b/lisp/simple.el index 461ee1e92e0..fc4ac793eab 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -1413,20 +1413,14 @@ If you are thinking of using this in a Lisp program, consider using `forward-line' instead. It is usually easier to use and more reliable (no dependence on goal column, etc.)." (interactive "p") - (let ((opoint (point))) - (if next-line-add-newlines - (if (/= arg 1) - (line-move arg) - (forward-line 1) - (if (or (= opoint (point)) (not (eq (preceding-char) ?\n))) - (insert ?\n) - (goto-char opoint) - (line-move arg))) - (if (eobp) - (signal 'end-of-buffer nil)) - (line-move arg) - (if (= opoint (point)) - (end-of-line)))) + (if (and next-line-add-newlines (= arg 1)) + (let ((opoint (point))) + (forward-line 1) + (if (or (= opoint (point)) (not (eq (preceding-char) ?\n))) + (insert ?\n) + (goto-char opoint) + (line-move arg))) + (line-move arg)) nil) (defun previous-line (arg) @@ -1462,29 +1456,43 @@ at the start of current run of vertical motion commands. When the `track-eol' feature is doing its job, the value is 9999.") (defun line-move (arg) - (if (not (or (eq last-command 'next-line) - (eq last-command 'previous-line))) - (setq temporary-goal-column - (if (and track-eol (eolp) - ;; Don't count beg of empty line as end of line - ;; unless we just did explicit end-of-line. - (or (not (bolp)) (eq last-command 'end-of-line))) - 9999 - (current-column)))) - (if (not (integerp selective-display)) - (forward-line arg) - ;; Move by arg lines, but ignore invisible ones. - (while (> arg 0) - (vertical-motion 1) - (forward-char -1) - (forward-line 1) - (setq arg (1- arg))) - (while (< arg 0) - (vertical-motion -1) - (beginning-of-line) - (setq arg (1+ arg)))) - (move-to-column (or goal-column temporary-goal-column)) - nil) + (let ((signal + (catch 'exit + (if (not (or (eq last-command 'next-line) + (eq last-command 'previous-line))) + (setq temporary-goal-column + (if (and track-eol (eolp) + ;; Don't count beg of empty line as end of line + ;; unless we just did explicit end-of-line. + (or (not (bolp)) (eq last-command 'end-of-line))) + 9999 + (current-column)))) + (if (not (integerp selective-display)) + (or (and (zerop (forward-line arg)) + (bolp)) + (throw 'exit (if (bobp) + 'beginning-of-buffer + 'end-of-buffer))) + ;; Move by arg lines, but ignore invisible ones. + (while (> arg 0) + (end-of-line) + (and (zerop (vertical-motion 1)) + (throw 'exit 'end-of-buffer)) + (setq arg (1- arg))) + (while (< arg 0) + (beginning-of-line) + (and (zerop (vertical-motion -1)) + (throw 'exit 'beginning-of-buffer)) + (setq arg (1+ arg)))) + (move-to-column (or goal-column temporary-goal-column)) + nil))) + (cond + ((eq signal 'beginning-of-buffer) + (message "Beginning of buffer") + (ding)) + ((eq signal 'end-of-buffer) + (message "End of buffer") + (ding))))) ;;; Many people have said they rarely use this feature, and often type ;;; it by accident. Maybe it shouldn't even be on a key.